iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
Modern Web

起步Go!Let's Go!系列 第 20

[ Day 20 ] Go 反射:程式碼的魔法鏡

  • 分享至 

  • xImage
  •  

Go 語言實現了反射,所謂反射就是能檢查程式在執行時的狀態。我們一般用到的套件是 reflect 套件。如何運用 reflect 套件,官方的這篇文章詳細的講解了 reflect 套件的實現原理,laws of reflection
使用 reflect 一般分成三步,下面簡要的講解一下:要去反射是一個型別的值(這些值都實現了空 interface),首先需要把它轉化成 reflect 物件(reflect.Type 或者 reflect.Value,根據不同的情況呼叫不同的函式)。這兩種取得方式如下

t := reflect.TypeOf(i)    //得到型別的 Meta 資料,透過 t 我們能取得型別定義裡面的所有元素
v := reflect.ValueOf(i)   //得到實際的值,透過 v 我們取得儲存在裡面的值,還可以去改變值

轉化為 reflect 物件之後我們就可以進行一些操作了,也就是將 reflect 物件轉化成相應的值,例如:

tag := t.Elem().Field(0).Tag  //取得定義在 struct 裡面的標籤
name := v.Elem().Field(0).String()  //取得儲存在第一個欄位裡面的值

取得反射值能回傳相應的型別和數值

var x float64 = 3.4
v := reflect.ValueOf(x)
fmt.Println("type:", v.Type())
fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
fmt.Println("value:", v.Float())

最後,反射的話,那麼反射的欄位必須是可修改的,我們前面學習過傳值和傳參考,這個裡面也是一樣的道理。反射的欄位必須是可讀寫的意思是,如果下面這樣寫,那麼會發生錯誤

var x float64 = 3.4
v := reflect.ValueOf(x)
v.SetFloat(7.1)

如果要修改相應的值,必須這樣寫

var x float64 = 3.4
p := reflect.ValueOf(&x)
v := p.Elem()
v.SetFloat(7.1)

上面只是對反射的簡單介紹,更深入的理解還需要自己在程式設計中不斷的實踐。


上一篇
[ Day19 ] Go 介面實作:編織功能的契約
下一篇
[ Day 21 ] Go HTTP 伺服器:啟航你的網路冒險之旅
系列文
起步Go!Let's Go!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言